package Kuaishou;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Random;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ForkJoinPool;
import java.util.concurrent.RecursiveTask;

import com.google.common.collect.Lists;

/**
 * Java在JDK7之后加入了并行计算的框架Fork/Join，可以解决我们系统中大数据计算的性能问题。
 * Fork/Join采用的是分治法，Fork是将一个大任务拆分成若干个子任务，子任务分别去计算，而Join是获取到子任务的计算结果，然后合并，这个是递归的过程。
 * 子任务被分配到不同的核上执行时，效率最高。
 */
public class Test16并行计算 {
    public static void main(String[] args) throws Exception {
        int size = 13880000;
        List<Long> list = new ArrayList<>(size);
        for (long i = 0; i < size; i++) {
            list.add(i + 1);
        }

        long start1 = System.currentTimeMillis();
        long correctSum = 0;
//        for (int i = 0; i < list.size(); i++) {
//            correctSum += list.get(i);
//        }
        for (long num : list) {
            correctSum += num;
        }
        System.out.println(correctSum);
        System.out.println(System.currentTimeMillis() - start1);

//        ForkJoinPool forkJoinPool = new ForkJoinPool();
        long start2 = System.currentTimeMillis();
//        long sum = forkJoinPool.submit(() ->
//                list.parallelStream().reduce(0L, Long::sum)).get();
        long sum = list.parallelStream().reduce(0L, Long::sum);
//        System.out.println(correctSum);
        System.out.println(sum);
        System.out.println(System.currentTimeMillis() - start2);
    }
}
